<template>
    <div>
        <h4>- extends关键字实现继承</h4>
        <p>在 子的constructor方法 中使用 super() 调用父类的 constructor方法；其他地方使用 super.XXX 调用 父类 的方法和属性</p>
        <p>继承的实质是先将父类实例对象的属性和方法，加到this上面（所以必须先调用super方法），然后再用子类的构造函数修改this</p>
        <h4>- Object.getPrototypeOf方法可以用来从子类上获取父类，判断一个类是否继承了另一个类</h4>
        <h4>- super 关键字 作为函数调用时，（只能用在）在子类的构造函数之中，代表父类的构造函数；作为对象时，在普通方法中，指向父类的原型对象，在静态方法中，指向父类</h4>
        <ul>
            <li>定义在父类实例上的方法或属性，是无法通过super调用的：<code> 比如子类中无法通过 super.p 来获取到父类 constructor() {this.p = 2;} 中的p</code></li>
            <li>在子类普通方法中通过super调用父类的方法时，方法内部的this指向<b>当前的子类实例</b>；由于this指向子类实例，所以如果通过super对某个属性赋值，这时super就是this，赋值的属性会变成子类实例的属性</li>
            <li>在子类的静态方法中通过super调用父类的方法时，方法内部的this指向当前的子类，而不是子类的实例</li>
            <li>使用super的时候，必须显式指定是作为函数、还是作为对象使用</li>
        </ul>
        <h4>- 类的 prototype 属性和__proto__属性</h4>
        <ol>
            <li><em>子类的__proto__属性，表示构造函数的继承，总是指向父类</em><code>B.__proto__ = A;</code></li>
            <li><em>子类prototype属性的__proto__属性，表示方法的继承，总是指向父类的prototype属性</em><code>B.prototype.__proto__ = A.prototype;</code></li>
        </ol>
        <p>除了Function.prototype函数，任意其他函数都有prototype属性，都可以被继承</p>
        <p>如果不存在任何继承 class就是一个普通函数，所以直接继承Function.prototype，但是A调用后返回一个空对象（即Object实例）：</p>
        <code>class A {} ; A.__proto__ === Function.prototype; A.prototype.__proto__ === Object.prototype </code>
        <p>实例的 __proto__ 指向 prototype，所以子类实例的__proto__属性的__proto__属性，指向父类实例的__proto__属性</p>
        <h4>- 原生构造函数的继承</h4>
        <p>原生的构造函数包括：<b>Boolean()、Number()、String()、Array()、Date()、Function()、RegExp()、Error()、Object()</b></p>
        <p>ES5 是不可以的，ES6允许通过extends继承原生构造函数定义子类，但是要注意继承Object的子类时：无法通过super方法向父类Object传参</p>
        <h4>Mixin 模式 将多个对象合成为一个类</h4>
        <pre>
    <code>
        function mix(...mixins) {
            class Mix {
                constructor() {
                    for (let mixin of mixins) {
                        copyProperties(this, new mixin()); // 拷贝实例属性
                    }
                }
            }

            for (let mixin of mixins) {
                copyProperties(Mix, mixin); // 拷贝静态属性
                copyProperties(Mix.prototype, mixin.prototype); // 拷贝原型属性
            }

            return Mix;
        }

        function copyProperties(target, source) {
            for (let key of Reflect.ownKeys(source)) {
                if ( key !== 'constructor'
                    && key !== 'prototype'
                    && key !== 'name'
                ) {
                    let desc = Object.getOwnPropertyDescriptor(source, key);
                    Object.defineProperty(target, key, desc);
                }
            }
        }
    </code>
        </pre>
        <p>使用的时候，只要继承这个类即可 <code>class DistributedEdit extends mix(Loggable, Serializable) {}</code></p>
    </div>
</template>

<script>
export default {
    
}
</script>

<style scoped>

</style>